/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.telsoft.hms.lib.security.core;

import java.util.Date;
import java.util.Objects;

/**
 * @author HùngPV
 * thanbotbeo10@gmail.com, hungpv@telsoft.com.vn
 * Ngày tạo: 09/09/2014
 */

 // Lớp này được sử dụng cho các lớp khác kế thừa tạo thành Session có thể lưu trữ được các thông tin riêng
 // Các hàm NÊN override:
 //  - generateRandomSecurityKey

public abstract class AbstractSession {

    public AbstractSession() {
        init(15); // mặc định mỗi session tồn tại 15 phút nếu không có lệnh renew
    }

    public AbstractSession(int timeoutByMinutes) {
        init(timeoutByMinutes);
    }

    // tạo ra các thông số cơ bản cho một Session
    private void init(int timeoutByMinutes) {
        // tạo ra security key cho session này
        this.mstrSecurityKey = generateRandomSecurityKey();
        setTimeoutByMinutes(timeoutByMinutes);
        this.mdtLastRenewTime = java.util.Calendar.getInstance().getTime();
    }
    
    //<editor-fold desc="Bảo mật - Security key">
    // Security key, session được định danh theo thuộc tính này, có tác dụng như là một Session ID
    protected String mstrSecurityKey;
    
    // lấy ra Security Key
    public String getSecurityKey() {
        return mstrSecurityKey;
    }
    
    // hàm tạo ra Security Key, được gọi lúc khởi tạo đối tượng Session
    protected abstract String generateRandomSecurityKey();
    //</editor-fold>

    //<editor-fold desc="Thời gian tồn tại của Session">
    // thời gian lần cuối session được renew, quá khoảng thời gian này nếu session không được renew thì sẽ bị tính là không hợp lệ
    private long miTimeout;
    // thời gian lần cuối session được renew
    //quá khoảng thời gian này nếu session không được renew thì sẽ bị tính là không hợp lệ
    protected java.util.Date mdtLastRenewTime;
    
    public void setTimeoutByMinutes(int timeoutByMinutes) {
        this.miTimeout = timeoutByMinutes * 60 * 1000;
    }

    // lấy ra thời gian tối đa duy trì session nếu không được renew (tính bằng giây)
    public long getTimeoutByMiliseconds() {
        return this.miTimeout;
    }

    // làm mới session
    public void renewSession() {
        this.mdtLastRenewTime = java.util.Calendar.getInstance().getTime();
    }

    // lấy ra thời gian lần cuối session được renew
    public java.util.Date getLastRenewTime() {
        return this.mdtLastRenewTime;
    }

    public long timediff() {
        return java.util.Calendar.getInstance().getTime().getTime() - this.mdtLastRenewTime.getTime();
    }

    public boolean isTimedOut() {
        return timediff() > getTimeoutByMiliseconds();
    }
    
    public Date getTimeout(){
        return new Date(this.mdtLastRenewTime.getTime()+getTimeoutByMiliseconds());
    }
    //</editor-fold>

    //<editor-fold desc="Override equals + hashCode để đảm bảo 2 session được so sánh với nhau dựa trên Security Key">
    @Override
    public boolean equals(Object o) {
        try {
            return this.mstrSecurityKey.equals(((AbstractSession) o).mstrSecurityKey);
        } catch (Exception ex) {
            return false;
        }
    }

    @Override
    public int hashCode() {
        return 29 * 3 + Objects.hashCode(this.mstrSecurityKey);
    }
    //</editor-fold>
}
